package com.springboot.demo.common.utils;

import java.io.Serializable;
import java.net.URLEncoder;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.common.Zone;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;

/**
 * @author JuoChiu
 * 七牛配置
 * */
public class QiNiuUtils implements Serializable{
	
	private static Logger log = LoggerFactory.getLogger(QiNiuUtils.class);
	
	private static final long serialVersionUID = 6488113338324817354L;
	
	// 密钥配置
	final static Auth auth = Auth.create(Constants.QINIU_ACCESS_KEY, Constants.QINIU_SECRET_KEY);
	
	/**
	 * 华东	Zone.zone0(),华北	Zone.zone1(),华南	Zone.zone2(),北美	Zone.zoneNa0()
	 * 第二种方式: 自动识别要上传的空间(bucket)的存储区域是华东、华北、华南。
	 * */
    static Zone z = Zone.autoZone();
    static Configuration c = new Configuration(z);

	// 设置好账号的ACCESS_KEY和SECRET_KEY
	// 创建上传对象
	static UploadManager uploadManager = new UploadManager(c);
	
	/**
	 * @MethodName:
	 * @Author JuoChiu
	 * @Date 2018年2月27日 上午9:01:01
	 * @Description:获取上传凭证（前端用）
	 * 简单上传，使用默认策略，只需要设置上传的空间名就可以了
	 * @param bucketname 空间名
	 * @return
	 * @ReturnType String
	 */
	public static String getUpToken(String bucketname) {
		// (bucket, key) 覆盖上传
		String uploadToken = auth.uploadToken(bucketname);
		log.debug("--七牛上传凭证的token---》{}",uploadToken);
		
		return uploadToken;
	}
	
	/**
	 * @MethodName:getUrlKey
	 * @Author JuoChiu
	 * @Date 2018年2月27日 上午9:01:49
	 * @Description:解析出url
	 * @param urlKey 图片名称
	 * @return
	 * @throws Exception
	 * @ReturnType String
	 */
	public static String getUrlKey(String urlKey) throws Exception{
		String fileName = urlKey;
    	String domainOfBucket = Constants.domainOfBucket;
    	String encodedFileName = URLEncoder.encode(fileName, "utf-8");
    	String publicUrl = String.format("%s/%s", domainOfBucket, encodedFileName);
    	long expireInSeconds = 3600;//1小时，可以自定义链接过期时间
    	// 解析后得到的图片url
    	String finalUrl = auth.privateDownloadUrl(publicUrl, expireInSeconds);
    	
    	return finalUrl;
	}
	
	/**
	 * @MethodName:getUrlKey
	 * @Author JuoChiu
	 * @Date 2018年2月27日 上午9:02:33
	 * @Description:解析出url
	 * @param urlKey 图片名称
	 * @param domainOfBucket 空间域名
	 * @return
	 * @throws Exception
	 * @ReturnType String
	 */
	public static String getUrlKey(String urlKey,String domainOfBucket) throws Exception{
		String fileName = urlKey;
    	String encodedFileName = URLEncoder.encode(fileName, "utf-8");
    	String publicUrl = String.format("%s/%s", domainOfBucket, encodedFileName);
    	long expireInSeconds = 3600;//1小时，可以自定义链接过期时间
    	// 解析后得到的文件url
    	String finalUrl = auth.privateDownloadUrl(publicUrl, expireInSeconds);
    	log.debug("--解析后得到的文件url---》{}",finalUrl);
    	
    	return finalUrl;
	}
	
	/**
	 * @MethodName:generalKey
	 * @Author JuoChiu
	 * @Date 2018年2月27日 上午9:04:53
	 * @Description:生成文件key（灵活通用）
	 * @param prefixName 文件名称前缀
	 * @param suffixName 文件后缀
	 * @return
	 * @throws Exception
	 * @ReturnType String
	 */
	public static String generalKey(String prefixName,String suffixName) throws Exception{
		// 上传到七牛后保存的文件名
        String keyUrl = prefixName + "/"+DateUtil.timeStamp()+"_"+DateUtil.uuId().toString().replaceAll("-", "")+"."+suffixName;
        log.debug("---keyUrl--->{}",keyUrl);
        
        return keyUrl;
	}
	
	/**
	 * 生成文件key
	 * */
	public static String produceUrlKey(Integer osType) throws Exception{
		if(osType == 1){// ios
			// 上传到七牛后保存的文件名
	        String keyUrl = "ios/"+DateUtil.timeStamp()+"_"+DateUtil.uuId()+".jpg";
	        return keyUrl;
		}else{
			// 上传到七牛后保存的文件名
	        String keyUrl = "android/"+DateUtil.timeStamp()+"_"+DateUtil.uuId()+".jpg";
	        return keyUrl;
		}
	}

	/**
     * 上传
     * @param filePath 文件路径  （也可以是字节数组、或者File对象）
     * @param key 上传到七牛上的文件的名称  （同一个空间下，名称【key】是唯一的）
     * @param bucketName 空间名称  （这里是为了获取上传凭证）
	 * @throws Exception 
     */
    public static String upload(String filePath, String key, String bucketName) throws Exception {
        try {
            // 调用put方法上传
            Response res = null;
            res =uploadManager.put(filePath, key, getUpToken(bucketName));
            // 打印返回的信息
            log.debug("---res.bodyString()--->{}",res.bodyString());
            DefaultPutRet putRet = new Gson().fromJson(res.bodyString(), DefaultPutRet.class);
            log.debug("---putRet.key--->{}",putRet.key);
            log.debug("---putRet.hash--->{}",putRet.hash);
            return res.bodyString();
        } catch (QiniuException e) {
            Response r = e.response;
            log.debug("---r.bodyString()--->{}",r.bodyString());
            
			throw new QiniuException(r);
        }
    }
    
    /**
     * 主函数：程序入口，测试功能
     * @param args
     * @throws Exception 
     */
    public static void main(String[] args) throws Exception {
        /*// 上传文件的路径
        String filePath = "C:/Users/Public/Pictures/Sample Pictures/jay.jpg";
        // 要上传的空间
        String bucketName = Constants.privateBucketname;
        // 上传到七牛后保存的文件名
        String key = "image/"+UUID.randomUUID()+".jpg";

        upload(filePath, key, bucketName);*/
    	/*String upToken = getUpToken(Constants.privateBucketname);
    	System.out.println(upToken);*/
    	
    	/*Auth auth = Auth.create(Constants.QINIU_ACCESS_KEY, Constants.QINIU_SECRET_KEY);
    	
    	String upToken = auth.uploadToken(Constants.privateBucketname);
    	System.out.println(upToken);*/
    	
    	String fileName = "Ft3dV650zjhMHTPRk4oSMMwCo_Wv";
    	String domainOfBucket = "http://ovkuakiqe.bkt.clouddn.com";
    	String encodedFileName = URLEncoder.encode(fileName, "utf-8");
    	String publicUrl = String.format("%s/%s", domainOfBucket, encodedFileName);
    	long expireInSeconds = 3600;//1小时，可以自定义链接过期时间
    	String finalUrl = auth.privateDownloadUrl(publicUrl, expireInSeconds);
    	log.debug("---finalUrl--->{}",finalUrl);
    }
}
